package xml;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import remoto.Proxy;
import Controlador.CPR;
import dominioTO.ItemListaPreciosTO;
import dominioTO.ItemRemitoProveedorTO;
import dominioTO.RemitoProveedorTO;
import dominioTO.RodamientoTO;


public class CPR_In_RemitoProveedor {
	private String ARCHIVO;
	private static CPR_In_RemitoProveedor instancia;
	private Document doc;
	
	public static CPR_In_RemitoProveedor getInstancia(String nombreArchivo){
		if(instancia == null){
			instancia = new CPR_In_RemitoProveedor();
			
		}
		instancia.ARCHIVO = "http://localhost:8080/ServidorNegocio/xml/"+nombreArchivo;
		instancia.crearDocumento();
		return instancia;
	}
	
	private void crearDocumento(){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public RemitoProveedorTO recibirRemitoProveedor1() throws RemoteException{
		
		//RemitoProveedorTO OPClienteTO= new RemitoProveedorTO();
		RemitoProveedorTO remitoProv= new RemitoProveedorTO();
		
		NodeList listaNodos = doc.getElementsByTagName("Remito");
		Node nodo_OP = listaNodos.item(0);
		Element element_OP = (Element) nodo_OP;
				
		
		NodeList nodeListCotizacion  = element_OP.getElementsByTagName("OrdenPedido");
		if (nodeListCotizacion != null){
			for (int j = 0; j < nodeListCotizacion.getLength(); j ++)
			{
				//Extraigo el nodo de la lista de nodos
				Node node_Cotizacion = (Element) nodeListCotizacion.item(j);
				Element element_Cotizacion = (Element) node_Cotizacion; 
				
				Integer idOrdenCompraProveedor = Integer.parseInt(element_Cotizacion.getElementsByTagName("Numero").item(0).getTextContent());
				 //FaltaBuscar y setear la orden de CompraTO
				remitoProv.setOrdenCompraProveedor(CPR.getInstancia().buscarOrdenCompraProveedor(idOrdenCompraProveedor));
				
				//Busco nodo rodamiento --> Contiene Items
				NodeList nodeListRodamiento  = element_Cotizacion.getElementsByTagName("Item");
				
				List<ItemRemitoProveedorTO> itemRemitoProv= new ArrayList<ItemRemitoProveedorTO>();
				
				if (nodeListRodamiento != null){
					for (int k = 0; k < nodeListRodamiento.getLength(); k ++) 
					{
						Node nodeRodamientos = nodeListRodamiento.item(j);
						if (nodeRodamientos.getNodeType() == Node.ELEMENT_NODE) {
							Element elementRodamiento = (Element) nodeRodamientos;
							
							//ItemCotizacionTO aux = mapItemCotizacionRodamiento(elementRodamiento, idOrdenCompraProveedor);
							ItemRemitoProveedorTO aux = mapItemRemitoProveedor(elementRodamiento, idOrdenCompraProveedor);
							if(aux!=null)
							{
								itemRemitoProv.add(aux);	
							}						
						}
					}
				}
				remitoProv.setItemRemitoProveedor(itemRemitoProv);
			}
		
		}
		return remitoProv;

	}
	
	


	private ItemRemitoProveedorTO  mapItemRemitoProveedor(Element elementItem, Integer id) throws RemoteException {
		
		
		Integer cantidad = Integer.valueOf(elementItem.getElementsByTagName("Cantidad").item(0).getTextContent());
		//Busco si existe el rodamiento buscado
		String nSerie = elementItem.getAttribute("serie");
		String Marca = elementItem.getElementsByTagName("Marca").item(0).getTextContent();
		String Origen =elementItem.getElementsByTagName("Origen").item(0).getTextContent();
		String Sufijo = elementItem.getElementsByTagName("Sufijo").item(0).getTextContent();
		RodamientoTO rod = Proxy.getInstancia().buscarRodamiento(nSerie, Sufijo, Marca, Origen);
		
		//Busco en la cotizacion indicada por el cliente el Item que cumpla que la cantidad sea menor a la cotizada, y busco el precio
		ItemListaPreciosTO itemListaPrecios = CPR.getInstancia().getItemListaPrecioFromOrdenCompra(id, rod);
		
		if(itemListaPrecios!=null)
		{
			ItemRemitoProveedorTO item = new ItemRemitoProveedorTO();		
			item.setCantidadEntregada(cantidad);
			item.setItemListaPrecio(itemListaPrecios);
			return item;
		}
		return null;
	}
	

}
